#include <iostream>
#include<cassert>
#include"PalabraAleatoria.h"
#include<fstream>
#include"OrdenadorExterno.h"
#include<cstdlib>
#include<algorithm>

using namespace std;

#define IMP(v) \
cout<<"->"<<#v<<" = "<<v<<endl;
#define TEST(i) \
cout<<"->test "<<i<<" finalizo correctamente -----\n";

void testTamanioPalabraAleatoria(){
    assert(sizeof(PalabraAleatoria)== 32);
    //aparentemente c++ completa los tamanios de los objetos a multiplos de potencia de 2
    IMP(sizeof(PalabraAleatoria));
    char cadena[28];
    IMP(sizeof(cadena));
}//FUNCIONA


void testGuardarPalabrasAleatorias(){
    const unsigned short CANT_PALABRAS_ALEATORIAS= 8;
    PalabraAleatoria pas[CANT_PALABRAS_ALEATORIAS];
    ofstream salida("pas");
    const unsigned int TAM_BUFFER= sizeof(PalabraAleatoria)*CANT_PALABRAS_ALEATORIAS;
    PalabraAleatoria buffer[CANT_PALABRAS_ALEATORIAS];

    for(unsigned short i=0;i<CANT_PALABRAS_ALEATORIAS;i++){
        pas[i].setIdentificador(i+1);
    }
    salida.write((char*)&pas,TAM_BUFFER);
    salida.close();

    ifstream entrada("pas",fstream::binary);
    entrada.seekg(0,fstream::end);
    assert(entrada.tellg()== TAM_BUFFER);
    assert(entrada.tellg()== 32*CANT_PALABRAS_ALEATORIAS);
    //se verifica que los registros se guarden como 32 bytes
    IMP(entrada.tellg());
    TEST(1);

    entrada.seekg(0,fstream::beg);
    entrada.read((char*)buffer,TAM_BUFFER);
    assert(entrada.eof());
    TEST(2);
    /**IMPORTANTE: al leer cantidad de registros justos de un archivo siempre se
    lee HASTA el fin de archivo pero sin pararse sobre el fin de archivo. */

    for(unsigned short i=0;i<CANT_PALABRAS_ALEATORIAS;i++)
        IMP(buffer[i].getIdentificador());
    IMP(entrada.tellg());

}//FUNCIONA registros se almacenan como 32 bytes


void testCrearDirectorio(){
    system("mkdir directorioPrueba");
    system("mv Identificador.h directorioPrueba");
}//FUNCIONA


void testAbrirArchivoInexistente(){
    ofstream salida;
    salida.open("inexistente",ofstream::binary);
    assert(salida.is_open());
    system("mkdir runs/");
    salida.open("runs/run0");//NO FUNCA
}//FUNCIONA, archivo es creado y abierto


void testComparacionPalabrasAleatorias(){
    PalabraAleatoria pa1("martin",21),pa2("martin",30);
    unsigned long idMin= min(pa1.getIdentificador(),pa2.getIdentificador());
    assert(idMin== 21);
}//FUNCIONA

/*TESTS OrdenadorExterno ------------------------------------------------------*/

void testCrearRunsDiccionarioAcotado(){
    
}

int main()
{
    testCrearRunsDiccionarioAcotado();
    return 0;
}
